package cn.itcast.web.cargo;


import cn.itcast.domain.cargo.ContractProduct;
import cn.itcast.domain.cargo.ContractProductExample;
import cn.itcast.domain.cargo.Factory;
import cn.itcast.domain.cargo.FactoryExample;
import cn.itcast.service.cargo.ContractProductService;

import cn.itcast.service.cargo.FactoryService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;

import com.github.pagehelper.PageInfo;

import lombok.extern.log4j.Log4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("cargo/contractProduct")
@Log4j
public class ContractProductController extends BaseController {
    @Reference
    private ContractProductService contractProductService;
    @Reference
    private FactoryService factoryService;

    /**
     * 1、货物列表
     * 功能入口：购销合同列表点击货物
     * 请求参数：contractId 表示购销合同id
     */
    @RequestMapping("/list")
    public String list(String contractId,
                       @RequestParam(defaultValue = "1")Integer pageNum,
                       @RequestParam(defaultValue = "5")Integer pageSize
                       ){
        //添加日志信息
        log.info("执行货物列表查询开始");
        //创建查询条件对象
        ContractProductExample cpexample = new ContractProductExample();
        //添加查询条件
        ContractProductExample.Criteria criteria = cpexample.createCriteria();
        //根据购销合同的id进行查询货物
        criteria.andContractIdEqualTo(contractId);
        //封装分页
        PageInfo<ContractProduct> pageInfo=contractProductService.findByPage(cpexample,pageNum,pageSize);
        //查询货物厂家 创建查询对象
        FactoryExample ftexample = new FactoryExample();
        //创建查询条件 查询货物厂家
        ftexample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(ftexample);
        //保存购销合同id 货物列表 厂家
        request.setAttribute("contractId",contractId);
        request.setAttribute("pageInfo",pageInfo);
        request.setAttribute("factoryList",factoryList);

        return "cargo/product/product-list";
    }
    //货物的添加或修改
    @RequestMapping("/edit")
    public String save(ContractProduct contractProduct){
        //设置企业信息
        contractProduct.setCompanyId(getLoginCompanyId());
        contractProduct.setCompanyName(getLoginCompanyName());

        //判断主键是否为空,如果为空为添加,否则为修改
        if(StringUtils.isEmpty(contractProduct.getId())){
            contractProductService.save(contractProduct);
        }else {
            contractProductService.update(contractProduct);
        }
        //跳转到被修改的购销合同的页面
        return "redirect:/cargo/contractProduct/list?contractId="+contractProduct.getContractId();
    }



    @RequestMapping("/toUpdate")
    public String toupdate(String id){
        //根据货物id查询 货物
        ContractProduct contractProduct = contractProductService.findById(id);
        request.setAttribute("contractProduct",contractProduct);
        //2查询货物厂家 创建厂家条件查询对象
        FactoryExample factoryExample = new FactoryExample();
        FactoryExample.Criteria criteria = factoryExample.createCriteria();
        //按条件查询
        criteria.andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList",factoryList);
        return "cargo/product/product-update";
    }
    /**
     * 4、删除货物
     * 请求地址：http://localhost:8080/cargo/contractProduct/delete.do
     * 请求参数：
     *    id                货物id
     *    contractId        购销合同id
     */
    @RequestMapping("/delete")
    public String delete(String id,String contractId){
        // 根据货物id删除货物
        contractProductService.delete(id);
        // 重定向到列表
        return "redirect:/cargo/contractProduct/list?contractId="+contractId;
    }

    @RequestMapping("/toImport")
    public String toImport(String contractId){
        request.setAttribute("contractId",contractId);
        return "cargo/product/product-import";
    }

    //货物上传
    @RequestMapping("/import")
    public String importExcel(String contractId, MultipartFile file) throws IOException {
        //apachpoi解析excel  excel本质是一个xml  实现添加货物
        //根据文件流,创建工作簿
        XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());

        //获取表
        Sheet sheet = workbook.getSheetAt(0);
        //获取总行数
        int rowCount = sheet.getPhysicalNumberOfRows();
        //遍历表,从第二行开始  数据从第二行开始
        Row row = null;
        Cell cell= null;
        for (int i = 1; i < rowCount; i++) {
            //获取第二行数据
             row = sheet.getRow(i);

             //创建对象并封装  因为我们最终是添加货物
            ContractProduct cp = new ContractProduct();
            //厂家
            cp.setFactoryName(row.getCell(1).getStringCellValue());
            //货号
            cp.setProductNo(row.getCell(2).getStringCellValue());

            //数量 注意：如果excel中内容数据是数值类型，获取数值要用getNumericCellValue()
            cp.setCnumber((int) row.getCell(3).getNumericCellValue());

            //包装单位
            cp.setPackingUnit(row.getCell(4).getStringCellValue());

            //装率
            cp.setLoadingRate(String.valueOf(row.getCell(5).getNumericCellValue()));

            //箱数
            cp.setBoxNum((int) row.getCell(6).getNumericCellValue());

            //单价
            cp.setPrice(row.getCell(7).getNumericCellValue());

            //货物描述
            cp.setProductDesc(row.getCell(8).getStringCellValue());

            //要求
            cp.setProductRequest(row.getCell(9).getStringCellValue());

            // 注意： 必须要设置购销合同ID  【不要忘记， 查看表...】
            cp.setContractId(contractId);
            //设置厂家
            Factory factory = factoryService.findByName(cp.getFactoryName());
            if(factory !=null){
                cp.setFactoryId(factory.getId());
            }

            //设置企业信息
            cp.setCompanyId(getLoginCompanyId());
            cp.setCompanyId(getLoginCompanyId());

            //添加货物
            contractProductService.save(cp);
        }

        //购销合同添加货物完成后,跳转到购销合同列表
        return "redirect:/cargo/contract/list";

    }
}
